package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"io/ioutil"
	"log"
	"net/http"
	"os"
	"os/exec"
)

type ConfigRequest struct {
	Data string `json:"data"` // 用于接收前端发送的 'data' 字段
}

func readFile(filePath string) (string, error) {
	data, err := ioutil.ReadFile(filePath) // 读取文件内容
	if err != nil {
		return "", err
	}
	return string(data), nil
}

func writeToFile(filename string, data string) error {
	// 打开文件并清空内容，如果文件不存在则创建
	file, err := os.OpenFile(filename, os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		return fmt.Errorf("无法打开文件: %v", err)
	}
	defer func(file *os.File) {
		err := file.Close()
		if err != nil {

		}
	}(file)

	// 将数据写入文件
	_, err = file.WriteString(data + "\n")
	if err != nil {
		return fmt.Errorf("写入文件失败: %v", err)
	}

	processName := "PalServer-Win64-Shipping-Cmd.exe"

	// 结束进程
	err = killProcessByName(processName)
	if err != nil {
		log.Fatalf("Error: %v\n", err)
	} else {
		fmt.Printf("Process %s has been terminated.\n", processName)
	}

	return nil
}

func killProcessByName(processName string) error {
	// 使用 taskkill 命令来终止进程
	cmd := exec.Command("taskkill", "/F", "/IM", processName)
	err := cmd.Run()
	if err != nil {
		return fmt.Errorf("failed to kill process %s: %w", processName, err)
	}
	return nil
}

func main() {
	// 创建一个Gin实例
	r := gin.Default()
	r.LoadHTMLFiles("web/index.html")
	// 加载静态文件目录
	r.Static("web", "web")
	// 处理根路由，渲染 index.html 页面
	r.GET("/", func(c *gin.Context) {
		// 渲染 HTML 页面
		c.HTML(200, "index.html", nil)
	})

	r.GET("/config", func(c *gin.Context) {
		// 你可以在这里指定你的文件路径
		filePath := "./Pal/Saved/Config/WindowsServer/PalWorldSettings.ini"
		content, err := readFile(filePath)
		if err != nil {
			// 如果读取文件失败，返回 500 错误
			c.JSON(http.StatusInternalServerError, gin.H{
				"error": fmt.Sprintf("Failed to read file: %v", err),
			})
			return
		}

		// 返回文件内容
		c.JSON(http.StatusOK, gin.H{
			"data": content,
		})
	})

	r.POST("/modify", func(c *gin.Context) {
		var config ConfigRequest

		// 绑定前端发送的JSON数据到config结构体
		if err := c.ShouldBindJSON(&config); err != nil {
			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
			return
		}

		err := writeToFile("DefaultPalWorldSettings.ini", config.Data)
		if err != nil {
			c.JSON(http.StatusInternalServerError, gin.H{"error": "写入文件失败", "details": err.Error()})
			return
		}

		// 返回一个响应，表示数据已经成功接收
		c.JSON(http.StatusOK, gin.H{
			"message": "配置已成功提交",
			"data":    config.Data, // 返回接收到的数据
		})
	})

	// 启动Gin服务器
	if err := r.Run(":8080"); err != nil {
		log.Fatalf("could not start server: %v", err)
	}
}
